#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

struct Compare
{
    bool operator()(const pair<string, int>& x, const pair<string, int>& y)
    {
        return x.second < y.second;
    }
};


int main()
{
    string strs;
    getline(cin, strs);
    int n = strs.size();
    map<string, int> m;

    for (auto& e : strs)
    {
        if (e >= 'A' && e <= 'Z')
            e += 32;
    }


    for (int begin = 0, end = 0; end < n; end++)
    {
        while (strs[end] != ' ')
        {
            if (strs[end] == '.')
                break;
            end++;
        }
        string tmp = strs.substr(begin, end - begin);
        m[tmp]++;

        begin = end + 1;
    }

    vector<pair<string, int>> v;
    for (const auto& e : m)
    {
        v.push_back(e);
    }
    stable_sort(v.begin(), v.end());

    for (auto& e : v)
    {
        cout << e.first << ':' << e.second << endl;
    }

    return 0;
}


//class Solution {
//public:
//    struct Compare
//    {
//        bool operator()(const pair<string, int>& x, const pair<string, int>& y)
//        {
//            return x.second > y.second || (x.second == y.second && x.first < y.first);
//        }
//    };
//
//    vector<string> topKFrequent(vector<string>& words, int k)
//    {
//        map<string, int> m;
//        for (auto& e : words)
//        {
//            m[e]++;
//        }
//        vector<pair<string, int>> v;
//        for (auto& e : m)
//        {
//            v.push_back(e);
//        }
//        sort(v.begin(), v.end(), Compare());
//        for (auto& e : v)
//        {
//            cout << e.first << ':' << e.second << endl;
//        }
//        vector<string> ret;
//        for (int i = 0; i < k; i++)
//        {
//            ret.push_back(v[i].first);
//        }
//        return ret;
//
//    }
//};